<?php

namespace app\api\controller;
use app\api\model\AdminRole as AdminRoleModel;
use app\api\model\RoleRule as RoleRuleModel;
use app\api\model\Rule as RuleModel;
class Menu extends Base
{
    public function index()
    {
        // 通过角色id 获取对应的所属角色路由规则
        $admin_id=self::getAid();
        $adminRole = new AdminRoleModel();
        $role_ids = $adminRole->where('admin_id',$admin_id)->value('role_id');
        $role_ids_arr = explode(',',$role_ids);
        $roleRule = new RoleRuleModel();
        $RuleIds = $roleRule->whereIn('role_id',$role_ids_arr)->column('rule_id');
        $tmp = '';
        foreach ($RuleIds as $v) {
            $tmp .= ',' . $v; // 使用 .= 进行字符串拼接，而不是 = 进行覆盖赋值
        }
        // 去除开头的逗号
//        $tmp = ltrim($tmp, ',');
        $tmps = substr($tmp,  1);

        $rule = new RuleModel();
        $filds = 'id,name,img,pid,url';
        $list  = $rule->whereIn('id', $tmps)->field($filds)->select()->toArray();
        $menus = $this->List2Tree($list);
        return json(['code' => 200, 'msg' => '获取菜单成功', 'data' => $menus]);
    }

    /**
     * 优化后端递归转树
     * @param $list
     * @param $pk
     * @param $pid
     * @param $child
     * @param $root
     * @return array
     */
    protected function List2Tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
    {
        if (!is_array($list) || empty($list)) {
            return [];
        }

        // 初始化树结构
        $tree = [];

        // 创建基于主键的数组引用
        $aRefer = [];
        foreach ($list as $key => $data) {
            $aRefer[$data[$pk]] = &$list[$key];
        }

        foreach ($list as $key => $data) {
            $parentId = $data[$pid];

            // 如果根节点为0或者与当前数据项的父节点ID相等，则加入到树中
            if ($root == $parentId) {
                $tree[] = &$list[$key];
            } else {
                // 如果父节点存在于引用数组中，则将当前节点挂在父节点的子节点数组中
                if (isset($aRefer[$parentId])) {
                    $parent = &$aRefer[$parentId];
                    if (!isset($parent[$child])) {
                        $parent[$child] = [];
                    }
                    $parent[$child][] = &$list[$key];
                }
            }
        }

        return $tree;
    }

//    protected function List2Tree($list,$pk= 'id',$pid ='pid',$child = '_child',$root=0)
//    {
//        if (!is_array($list)) {
//            return [];
//        }
//        //创建基于主键的数组引用
//        $aRefer = [];
//        foreach ($list as $key => $data) {
//            $aRefer[$data[$pk]] = &$list[$key];
//        }
//
//        foreach ($list as $key => $data) {
//            //判断是否存在parent
//            $parentId = $data[$pid];
//            if ($root == $parentId) {
//                $tree[] = &$list[$key];
//            } else {
//                if (isset($aRefer[$parentId])) {
//                    $parent = $aRefer[$parentId];
//                    $parent[$child][] = &$list[$key];
//                }
//            }
//        }
//        return $tree;
//    }

//    public function getTree($array,$pid=0){
//        //声明静态数组，避免递归调用时，多次声明导致数组覆盖
//        static $list = [];
//        foreach ($array as $key => $value) {
//            //第一次遍历，找到父节点为根节点的节点 也就是pid=0的节点
//            if ($value['pid'] == $pid) {
//            //父节点为根节点的节点，级别为0，也就是第一级
//            //把数组放到list中
//            $list[] = $value;
//            //把这个节点从数组中移除，减少后续递归消耗
//            unset($array[$key]);
//            //开始递归，查到父ID为该节点ID的节点，级别则为原级别+1
//            $this->getTree($array,$value['id']);
//            }
//         }
//        return $list;
//    }



}